package org.example.scoresystem_backen.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.example.scoresystem_backen.entity.Course;

import java.util.List;

/**
 * 课程数据访问Mapper接口
 */
@Mapper
public interface CourseMapper {
    
    /**
     * 根据ID查找课程
     * @param id 课程ID
     * @return 课程信息
     */
    Course findById(@Param("id") Integer id);
    
    /**
     * 查找所有课程
     * @return 课程列表
     */
    List<Course> findAll();
    
    /**
     * 根据课程名称查找课程
     * @param name 课程名称
     * @return 课程信息
     */
    Course findByName(@Param("name") String name);
    
    /**
     * 根据课程代码查找课程
     * @param code 课程代码
     * @return 课程信息
     */
    Course findByCode(@Param("code") String code);
    
    /**
     * 根据课程名称模糊查询
     * @param name 课程名称关键字
     * @return 课程列表
     */
    List<Course> findByNameContaining(@Param("name") String name);
    
    /**
     * 检查课程名称是否存在
     * @param name 课程名称
     * @return 是否存在
     */
    boolean existsByName(@Param("name") String name);
    
    /**
     * 检查课程代码是否存在
     * @param code 课程代码
     * @return 是否存在
     */
    boolean existsByCode(@Param("code") String code);
    
    /**
     * 插入课程
     * @param course 课程信息
     * @return 影响行数
     */
    int insert(Course course);
    
    /**
     * 更新课程信息
     * @param course 课程信息
     * @return 影响行数
     */
    int update(Course course);
    
    /**
     * 根据ID删除课程
     * @param id 课程ID
     * @return 影响行数
     */
    int deleteById(@Param("id") Integer id);
    
    /**
     * 根据学分查找课程列表
     * @param credits 学分
     * @return 课程列表
     */
    List<Course> findByCredits(@Param("credits") java.math.BigDecimal credits);

    /**
     * 根据学分范围查找课程列表
     * @param minCredits 最小学分
     * @param maxCredits 最大学分
     * @return 课程列表
     */
    List<Course> findByCreditsBetween(@Param("minCredits") java.math.BigDecimal minCredits, @Param("maxCredits") java.math.BigDecimal maxCredits);

    /**
     * 根据课程代码模糊查询
     * @param code 课程代码关键字
     * @return 课程列表
     */
    List<Course> findByCodeContaining(@Param("code") String code);

    // ========== 分页查询相关方法 ==========

    /**
     * 分页查询课程（支持搜索和筛选）
     * @param pageRequest 分页请求参数
     * @return 课程列表
     */
    List<Course> findCoursesWithPagination(@Param("pageRequest") org.example.scoresystem_backen.dto.PageRequest pageRequest);

    /**
     * 统计课程总数（支持搜索和筛选）
     * @param pageRequest 分页请求参数
     * @return 总记录数
     */
    Long countCoursesWithConditions(@Param("pageRequest") org.example.scoresystem_backen.dto.PageRequest pageRequest);

    // ========== 级联删除相关方法 ==========

    /**
     * 删除课程相关的所有成绩记录
     * @param courseId 课程ID
     * @return 删除的记录数
     */
    int deleteScoresByCourseId(@Param("courseId") Integer courseId);

    /**
     * 获取所有课程，按名称排序
     * @return 课程列表
     */
    List<Course> findAllOrderByName();

    /**
     * 统计课程总数
     * @return 课程总数
     */
    Long count();
}
